#ifndef PERIPHERAL_UART_H__
#define PERIPHERAL_UART_H__

#include <inttypes.h>
#include <string>
#include <memory>
#include <map>
#include <vector>
#include "peripheral_com.h"

namespace El {
namespace Peripheral {

/**
 * @brief UART设备信息结构
 */
struct UartDeviceInfo {
    std::unique_ptr<Com> com; // 串口通信对象
    std::string devPath;      // 串口设备路径
    bool blockMode;           // 阻塞模式
    std::string description;  // 设备描述

    UartDeviceInfo() : blockMode(true) {}
};

/**
 * @brief UART串口管理类（支持多个串口）
 */
class UartManager {
public:
    static UartManager &GetInstance();

    /**
     * @brief 从配置初始化所有串口
     *
     * @return int32_t 成功返回0，失败返回负值
     */
    bool Start();

    /**
     * @brief 初始化指定名称的串口
     *
     * @param name 串口名称，如"uart0", "uart1"
     * @param dev 串口设备路径
     * @param block 是否阻塞模式
     * @return int32_t 成功返回0，失败返回负值
     */
    int32_t InitUart(const std::string &name, const std::string &dev, bool block = true);

    /**
     * @brief 获取指定名称的串口Com对象
     *
     * @param name 串口名称
     * @return Com* 串口Com对象指针，不存在返回nullptr
     */
    Com *GetUart(const std::string &name);

    /**
     * @brief 获取指定名称的串口设备信息
     *
     * @param name 串口名称
     * @return UartDeviceInfo* 串口设备信息指针，不存在返回nullptr
     */
    UartDeviceInfo *GetUartInfo(const std::string &name);

    /**
     * @brief 设置串口属性
     *
     * @param name 串口名称
     * @param attr 串口属性
     * @return int32_t 成功返回0，失败返回负值
     */
    int32_t SetUartAttribute(const std::string &name, const UART_ATTR &attr);

    /**
     * @brief 关闭指定串口
     *
     * @param name 串口名称
     * @return int32_t 成功返回0，失败返回负值
     */
    int32_t DeinitUart(const std::string &name);

    /**
     * @brief 关闭所有串口
     *
     * @return int32_t 成功返回0，失败返回负值
     */
    int32_t DeinitAll();

    /**
     * @brief 获取所有已初始化的串口名称列表
     *
     * @return std::vector<std::string> 串口名称列表
     */
    std::vector<std::string> GetInitializedUarts() const;

    /**
     * @brief 检查指定串口是否已初始化
     *
     * @param name 串口名称
     * @return bool true=已初始化，false=未初始化
     */
    bool IsUartInitialized(const std::string &name) const;

    /**
     * @brief 获取指定串口的设备路径
     *
     * @param name 串口名称
     * @return std::string 设备路径，不存在返回空字符串
     */
    std::string GetUartDevicePath(const std::string &name) const;

private:
    UartManager();
    ~UartManager();

    std::map<std::string, std::unique_ptr<UartDeviceInfo>> uartDevices_; // 串口设备映射
};

} // namespace Peripheral
} // namespace El

#endif // PERIPHERAL_UART_H__
